package com.simhash;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.*;

import java.io.BufferedReader;

public class TF_IDF {
	
	//定义文档库中的文件总数
	public static int TextNum = 1;
	/* @函数：int TxtComparison(String ciyu)
	 * @作用：输入一个词，返回该词在文档库中出现过的文件数
	 * */
	public static int TxtComparison(String ciyu) {
		int text_num = 0;//定义总出现次数
		for(int i=0; i<TF_IDF.TextNum; i++){//遍历1000篇文档
			String filename = SimhashConstants.REFERENCE_DOCS_PATH;
			filename += (i+SimhashConstants.REFERENCE_DOCS_FORMATTER);//组合定义文件路径及文件名
			File file_name = new File(filename);//创建文件路径
			try {
				InputStreamReader isr = new InputStreamReader(new FileInputStream(file_name),"UTF-8");
				//编码方式UTF-8，防止中文乱码
				BufferedReader bufr = new BufferedReader(isr);
				String s = null;//临时存储每行数据
				boolean num = false;//临时存储目标文档是否含有指定字符串
				while((s = bufr.readLine()) != null) {//遍历目标文档每行
					//System.out.println(s);
					if(s.contains(ciyu)){//如果含有指定字符串
						//System.out.println("第" + i + "篇文章中有");
						num = true;//标志位赋值
						break;//退出（节省时间）
					}
				}
				bufr.close();
				isr.close();
				if(num) {//根据标志位状态，让总出现次数增加
					text_num ++;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return text_num+1;//返回总出现次数+1
	}
	/* @函数：String Set(String str_fch)
	 * @作用：输入分词后的字符串，输出所有“词##权重/”字符串
	 * */
	public static String Set(String str_fch) {
		String str_zh = "";//创建最终字符串
		String[] WordArray = str_fch.split("/");//对分词后字符串分割
		try {
			Class.forName("com.mysql.jdbc.Driver");//加载驱动
			Connection con = DriverManager.getConnection(SimhashConstants.URL,SimhashConstants.USER,SimhashConstants.PASSWORD);//加载数据库
			Statement sql = con.createStatement();//数据库连接
			
			for(int i=0; i<WordArray.length; i++){//遍历每个词
				/*###第一步：计算TF值*/
				int TF_Fre = 0;//定义频率为0
				//计算每个词的频率
				for(int j=0; j<WordArray.length; j++){
					if(WordArray[i].equals(WordArray[j])){
						TF_Fre++;
					}
				}
				//频率归一化
				float TF = (float) (1.0*TF_Fre/WordArray.length);
				//System.out.println(WordArray[i]+"的TF值为"+TF);
				/*###第二步：计算IDF值*/
				float IDF = 0;//先定义IDF
				ResultSet rs = sql.executeQuery("select * from idf WHERE ciyu = '"+WordArray[i]+"' ");
				if(rs.next()) {//如果数据库中有这个词
					IDF = rs.getFloat("idf");//获取该词的IDF值
				} else {//没有这个词，则计算这个词的IDF，写入数据库
					//计算该词在文件库出现的文件数
					int IDF_a = TF_IDF.TxtComparison(WordArray[i]);
					//System.out.println(WordArray[i]+"在文件库中出现了"+IDF_a);
					//总文件数  除以  该词在文件库中出现的次数
					float IDF_b = (float) ((TF_IDF.TextNum+1.0)/IDF_a);
					//System.out.println(IDF_b);
					//IDF = log 2 (IDF_b)
					IDF = (float) (Math.log(IDF_b)/Math.log(2));
					System.out.println("·数据库新增词汇：" + WordArray[i] + "，对应IDF值为" + IDF);
					//写入数据库
					String new_member="insert into idf(ciyu,txt,idf) values('"+WordArray[i]+"','"+IDF_a+"','"+IDF+"')";
					sql.executeUpdate(new_member);
				}
				/*###第三步：计算TF-IDF值*/
				float TFIDF = TF * IDF;
				//System.out.println(WordArray[i]+"的TF-IDF值为"+TFIDF);
				/*###第四步：将计算结果写入字符串*/
				str_zh = str_zh + WordArray[i] + "##" + TFIDF + "/";
			}
			con.close();
		} catch(Exception E) {
			System.out.println("SQL异常！！！！");
			E.printStackTrace();
		}
		System.out.println("字符串处理完毕，已生成该字符串的最终字符串！");
		System.out.println(str_zh);
		return str_zh;
	}
}